home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Kit PC World De Ampliacion De Windows 95
/
Kit PC World de ampliacion de Windows 95.iso
/
internet
/
sweeper
/
samples
/
olecon~1
/
controls
/
circle
/
circle~1.cpp
< prev
next >
Wrap
Text File
|
1995-11-25
|
12KB
|
415 lines
//=--------------------------------------------------------------------------=
// CircleCtl.Cpp
//=--------------------------------------------------------------------------=
// Copyright 1995 Microsoft Corporation. All Rights Reserved.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//=--------------------------------------------------------------------------=
//
#include "IPServer.H"
#include "Guids.H"
#include "CircleCtl.H"
#include "LocalObj.H"
#include "Util.H"
#include "Globals.H"
#include "Resource.H"
// for ASSERT and FAIL
//
SZTHISFILE
//=--------------------------------------------------------------------------=
// Custom Verbs
//=--------------------------------------------------------------------------=
// if you don't have a property page, some hosts such as Visual Basic 4.0,
// will give you a default verb, such as "Activate Object". this is slightly
// sub-optimal, so instead, we're just going to define our own verb to show
// our about box.
//
#define CTLIVERB_ABOUTBOX 5
VERBINFO rgCircleCustomVerbs [] = {
{ CTLIVERB_ABOUTBOX, IDS_CIRCLE_ABOUTBOXVERB, 0, OLEVERBATTRIB_ONCONTAINERMENU }
};
//=--------------------------------------------------------------------------=
// CCircleControl::Create
//=--------------------------------------------------------------------------=
// global static function that creates an instance of the control an returns
// an IUnknown pointer for it.
//
// Parameters:
// IUnknown * - [in] controlling unknown for aggregation
//
// Output:
// IUnknown * - new object.
//
// Notes:
//
IUnknown *CCircleControl::Create
(
IUnknown *pUnkOuter
)
{
// make sure we return the private unknown so that we support aggegation
// correctly!
//
CCircleControl *pNew = new CCircleControl(pUnkOuter);
return pNew->PrivateUnknown();
}
//=--------------------------------------------------------------------------=
// CCircleControl::CCircleControl
//=--------------------------------------------------------------------------=
// "Being born is like being kidnapped. And then sold into slavery."
// - andy warhol (1928 - 87)
//
// Parameters:
// IUnknown * - [in]
//
// Notes:
//
#pragma warning(disable:4355) // using 'this' in constructor
CCircleControl::CCircleControl
(
IUnknown *pUnkOuter
)
: COleControl(pUnkOuter, OBJECT_TYPE_CTLCIRCLE, (IDispatch *)this)
{
// initialize anything here ...
//
memset(&m_state, 0, sizeof(CIRCLECTLSTATE));
// TODO: initialize anything you need to here.
}
#pragma warning(default:4355) // using 'this' in constructor
//=--------------------------------------------------------------------------=
// CCircleControl::~CCircleControl
//=--------------------------------------------------------------------------=
// "We all labour against our own cure, for death is the cure of all diseases"
// - Sir Thomas Browne (1605 - 82)
//
// Notes:
//
CCircleControl::~CCircleControl ()
{
// TODO: clean up anything here.
}
//=--------------------------------------------------------------------------=
// CCircleControl:RegisterClassData
//=--------------------------------------------------------------------------=
// register the window class information for your control here.
// this information will automatically get cleaned up for you on DLL shutdown.
//
// Output:
// BOOL - FALSE means fatal error.
//
// Notes:
//
BOOL CCircleControl::RegisterClassData
(
void
)
{
WNDCLASS wndclass;
// TODO: register any additional information you find interesting here.
// this method is only called once for each type of control
//
memset(&wndclass, 0, sizeof(WNDCLASS));
wndclass.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
wndclass.lpfnWndProc = COleControl::ControlWindowProc;
wndclass.hInstance = g_hInstance;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclass.lpszClassName = WNDCLASSNAMEOFCONTROL(OBJECT_TYPE_CTLCIRCLE);
return RegisterClass(&wndclass);
}
//=--------------------------------------------------------------------------=
// CCircleControl::BeforeCreateWindow
//=--------------------------------------------------------------------------=
// called just before the window is created. Great place to set up the
// window title, etc, so that they're passed in to the call to CreateWindowEx.
// speeds things up slightly.
//
// Notes:
//
void CCircleControl::BeforeCreateWindow
(
void
)
{
// TODO: users should modify m_dwWindowStyle, m_dwWindowStyleEx, m_szWindowTitle
// et al here so that the call to createwindow has as much information as
// possible.
// if you don't use this function, then you can probably just remove it.
}
//=--------------------------------------------------------------------------=
// CCircleControl::InternalQueryInterface
//=--------------------------------------------------------------------------=
// qi for things only we support.
//
// Parameters:
// Parameters:
// REFIID - [in] interface they want
// void ** - [out] where they want to put the resulting object ptr.
//
// Output:
// HRESULT - S_OK, E_NOINTERFACE
//
// Notes:
//
HRESULT CCircleControl::InternalQueryInterface
(
REFIID riid,
void **ppvObjOut
)
{
IUnknown *pUnk;
*ppvObjOut = NULL;
// TODO: if you want to support any additional interrfaces, then you should
// indicate that here. never forget to call COleControl's version in the
// case where you don't support the given interface.
//
if (DO_GUIDS_MATCH(riid, IID_ICircle)) {
pUnk = (IUnknown *)(ICircle *)this;
} else{
return COleControl::InternalQueryInterface(riid, ppvObjOut);
}
pUnk->AddRef();
*ppvObjOut = (void *)pUnk;
return S_OK;
}
//=--------------------------------------------------------------------------=
// CCircleControl::LoadTextState
//=--------------------------------------------------------------------------=
// load in our text state for this control.
//
// Parameters:
// IPropertyBag * - [in] property bag to read from
// IErrorLog * - [in] errorlog object to use with proeprty bag
//
// Output:
// HRESULT
//
// Notes:
// - NOTE: if you have a binary object, then you should pass an unknown
// pointer to the property bag, and it will QI it for IPersistStream, and
// get said object to do a Load()
//
STDMETHODIMP CCircleControl::LoadTextState
(
IPropertyBag *pPropertyBag,
IErrorLog *pErrorLog
)
{
// TODO: implement your text load code here.
//
return S_OK;
}
//=--------------------------------------------------------------------------=
// CCircleControl::LoadBinaryState
//=--------------------------------------------------------------------------=
// loads in our binary state using streams.
//
// Parameters:
// IStream * - [in] stream to write to.
//
// Output:
// HRESULT
//
// Notes:
//
STDMETHODIMP CCircleControl::LoadBinaryState
(
IStream *pStream
)
{
// TODO: implement your binary load code here. to prevent this from being
// a massive performance sink, you should probably try to organize your
// properties in such a way that enables you to do just one IStream::Read
// in the LoadBinaryState function. fast is good.
//
return S_OK;
}
//=--------------------------------------------------------------------------=
// CCircleControl::SaveTextState
//=--------------------------------------------------------------------------=
// saves out the text state for this control using a property bag.
//
// Parameters:
// IPropertyBag * - [in] the property bag with which to work.
// BOOL - [in] if TRUE, then write out ALL properties, even
// if they're their the default value ...
//
// Output:
// HRESULT
//
// Notes:
//
STDMETHODIMP CCircleControl::SaveTextState
(
IPropertyBag *pPropertyBag,
BOOL fWriteDefaults
)
{
// TODO: implement your text save code here.
//
return S_OK;
}
//=--------------------------------------------------------------------------=
// CCircleControl::SaveBinaryState
//=--------------------------------------------------------------------------=
// save out the binary state for this control, using the given IStream object.
//
// Parameters:
// IStream * - [in] save to which you should save.
//
// Output:
// HRESULT
//
// Notes:
// - it is important that you seek to the end of where you saved your
// properties when you're done with the IStream.
//
STDMETHODIMP CCircleControl::SaveBinaryState
(
IStream *pStream
)
{
// TODO: implement your binary save state code here. to prevent this from being
// a massive performance sink, you should probably try to organize your
// properties in such a way that enables you to do just one IStream::Read
// in the LoadBinaryState function. fast is good.
//
return S_OK;
}
//=--------------------------------------------------------------------------=
// CCircleControl::OnDraw
//=--------------------------------------------------------------------------=
// "I don't very much enjoy looking at paintings in general. i know too
// much about them. i take them apart."
// - georgia o'keeffe (1887-1986)
//
// Parameters:
// HDC - [in] HDC to draw to
// LPCRECTL - [in] rect we're drawing to
// LPCRECTL - [in] window extent and origin for meta-files
// HDC - [in] HIC for target device
//
// Output:
// HRESULT
//
// Notes:
//
HRESULT CCircleControl::OnDraw
(
HDC hdcDraw,
LPCRECTL prcBounds,
LPCRECTL prcWBounds,
HDC hicTargetDevice
)
{
HPEN hpen, hpenOld;
hpen = CreatePen(PS_SOLID, 2, RGB(0,255,0));
if (!hpen)
return E_FAIL;
hpenOld = SelectObject(hdcDraw, hpen);
Ellipse(hdcDraw, prcBounds->left, prcBounds->top, prcBounds->right, prcBounds->bottom);
SelectObject(hdcDraw, hpenOld);
DeleteObject(hpen);
return S_OK;
}
//=--------------------------------------------------------------------------=
// CCircleControl::WindowProc
//=--------------------------------------------------------------------------=
// window procedure for this control. nothing terribly exciting.
//
// Parameters:
// see win32sdk on window procs.
//
// Notes:
//
LRESULT CCircleControl::WindowProc
(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
// TODO: handle any messages here, like in a normal window
// proc. note that for special keys, you'll want to override and
// implement OnSpecialKey.
//
return DefWindowProc(hwnd, msg, wParam, lParam);
}
//=--------------------------------------------------------------------------=
// CCircleControl::DoCustomVerb
//=--------------------------------------------------------------------------=
//
// long lverb
//
// notes:
//
HRESULT CCircleControl::DoCustomVerb
(
LONG lVerb
)
{
if (lVerb == CTLIVERB_ABOUTBOX) {
AboutBox();
return S_OK;
}
return OLEOBJ_S_INVALIDVERB;
}
//=--------------------------------------------------------------------------=
// CCircleControl::AboutBox
//=--------------------------------------------------------------------------=
// prints up an about box. fweeeee.
//
// Notes:
//
void CCircleControl::AboutBox
(
void
)
{
// TODO: Ideally, one would use DialogBox, and some sort of Dialog Box here if
// they wanted a slightly more interesting About Box ... you should
// still call ModalDialog first, however.
//
ModalDialog(TRUE);
MessageBox(NULL, "This is My Control", "About Circle", MB_OK | MB_TASKMODAL);
ModalDialog(FALSE);
}